/**************************************************************************//**
 * @item     CosyOS-III 例程（服务应用）
 * @file     reent_semaph.c
 * @brief    重入访问_计数信号量
 * @details  通过计数信号量的{获取<-归还}，实现在任务中对任务级可重入资源的重入访问。
 * @note     可实现超时处理机制。
 * @author   迟凯峰
 * @version  V1.0.0
 * @date     2025.10.25
 ******************************************************************************/

#if 1 /* 编译开关 */

#include "CosyOS.H"

uCreateSem(sem_0, 2, 2); // 创建计数信号量，用于重入访问，初始值=最大值=资源数量

/* task_1 */
uCreateTask(task_1, 1, 384, 0, 0)
{
    while(1){
        if(uTakeSem(sem_0, xTick_ms(500))){ // 如果超时时间为~0，不再支持超时处理
            /* 重入访问 任务级可重入资源 开始 */
            
            /* 重入访问 任务级可重入资源 结束 */
            uBackSem(sem_0);
        }
        else{
            /* 超时处理 开始 */
            
            /* 超时处理 结束 */
        }
    }
}

/* task_2 */
uCreateTask(task_2, 2, 384, 0, 0)
{
    while(1){
        if(uTakeSem(sem_0, xTick_ms(500))){ // 如果超时时间为~0，不再支持超时处理
            /* 重入访问 任务级可重入资源 开始 */
            
            /* 重入访问 任务级可重入资源 结束 */
            uBackSem(sem_0);
        }
        else{
            /* 超时处理 开始 */
            
            /* 超时处理 结束 */
        }
    }
}

/* task_3 */
uCreateTask(task_3, 3, 384, 0, 0)
{
    while(1){
        if(uTakeSem(sem_0, xTick_ms(500))){ // 如果超时时间为~0，不再支持超时处理
            /* 重入访问 任务级可重入资源 开始 */
            
            /* 重入访问 任务级可重入资源 结束 */
            uBackSem(sem_0);
        }
        else{
            /* 超时处理 开始 */
            
            /* 超时处理 结束 */
        }
    }
}

/* 启动钩子 */
void start_hook(void)
{
    uStartTask_Ready(task_1); // 启动task_1，初始状态为就绪状态
    uStartTask_Ready(task_2); // 启动task_2，初始状态为就绪状态
    uStartTask_Ready(task_3); // 启动task_3，初始状态为就绪状态
}

#endif
